`timescale 1ns / 1ps
/*--------------------------------------------------------------------*\
FileName        : cbb_pulse_stretch.v
Author          ：hpy
Email           ：yuan_hp@qq.com
Date            ：2025年05月16日
Description     ：脉冲展宽

1.例化
cbb_pulse_stretch #(
    .STRETCH_WIDTH  (4) // 展宽脉冲宽度
) u_cbb_pulse_stretch (
    .i_clk( clk),  // 时钟
    .i_rst_n( rst_n) , // 低电平复位
    .i_pulse( i_pulse) , // 输入脉冲 
    .o_pulse( )  // 输出展宽的脉冲
);


\*--------------------------------------------------------------------*/
module cbb_pulse_stretch #(
    parameter STRETCH_WIDTH  = 4 // 展宽脉冲宽度
)(
    input      i_clk,
    input      i_rst_n ,
    input      i_pulse , 
    output reg o_pulse
);
initial begin 
    if(STRETCH_WIDTH<1) begin
        $error("cbb_pulse_stretch.STRETCH_WIDTH must >=1") ;
        $finish ;
    end
end 
/* ------------------ function -------------------- */

/* -------------------- param --------------------- */
localparam N =$clog2(STRETCH_WIDTH) ;
/*---------------------- reg ---------------------- */
reg[N-1:0]counter;
/*----------------------- wire ---------------------*/

/*--------------------- assign ---------------------*/

/*---------------------- blk -----------------------*/
always @(posedge i_clk or negedge i_rst_n) begin
    if(!i_rst_n)begin
        counter <= STRETCH_WIDTH-1'B1 ;
        o_pulse <=1'b0;
    end else begin
        if(i_pulse) begin
            counter <= STRETCH_WIDTH-1'B1 ;
            o_pulse <=1'b1;
        end else if(|counter) begin
            counter <= counter - 1'b1 ; 
            o_pulse <= 1'b1 ;
        end else begin
            o_pulse <= 1'b0 ;
        end
    end
end


endmodule

